require "import"
import "android.widget.*"
import "android.view.*"
import "cjson"
import "os"
import "android.app.AlertDialog"
import "android.widget.PopupMenu"
import "android.content.Context"

-- URLs das APIs
local stockApiUrlBase = "https://financialmodelingprep.com/api/v3/quote/" -- FMP para índices
local hgBrasilApiUrlBase = "https://api.hgbrasil.com/finance" -- HG Brasil para Ibovespa
local apiKeyFMP = "qw9oh3cBMTb5HHoXRraEcLCiRYZP7qL5" -- Chave FMP
local apiKeyHGBrasil = "e710c5f3" -- Chave HG Brasil

-- Lista das 20 principais bolsas com país e cidade
local indices = {
    { simbolo = "SPY", nome = "Estados Unidos - Nova York - S&P 500" },
    { simbolo = "QQQ", nome = "Estados Unidos - Nova York - NASDAQ 100" },
    { simbolo = "DIA", nome = "Estados Unidos - Nova York - Dow Jones" },
    { simbolo = "EWJ", nome = "Japão - Tóquio - MSCI Japan" },
    { simbolo = "EWH", nome = "Hong Kong - Hong Kong - Hang Seng" },
    { simbolo = "EWU", nome = "Reino Unido - Londres - FTSE 100" },
    { simbolo = "DAX", nome = "Alemanha - Frankfurt - DAX" },
    { simbolo = "EWG", nome = "Alemanha - Frankfurt - MSCI Germany" },
    { simbolo = "EWQ", nome = "França - Paris - CAC 40" },
    { simbolo = "^BVSP", nome = "Brasil - São Paulo - IBOVESPA" },
    { simbolo = "EWY", nome = "Coreia do Sul - Seul - KOSPI" },
    { simbolo = "EWA", nome = "Austrália - Sydney - ASX 200" },
    { simbolo = "INDA", nome = "Índia - Mumbai - BSE Sensex" },
    { simbolo = "INDY", nome = "Índia - Mumbai - NIFTY 50" },
    { simbolo = "EWL", nome = "Suíça - Zurique - SMI" },
    { simbolo = "EWC", nome = "Canadá - Toronto - S&P/TSX" },
    { simbolo = "EWN", nome = "Países Baixos - Amsterdã - AEX" },
    { simbolo = "EZA", nome = "África do Sul - Joanesburgo - MSCI South Africa" }, -- Substitui SSE 50
    { simbolo = "EWP", nome = "Espanha - Madri - IBEX 35" }, -- Substitui SSE Composite
    { simbolo = "EWT", nome = "Taiwan - Taipei - MSCI Taiwan" } -- Substitui Nikkei 225
}

-- Variável global
local indiceSelecionadoAtual = indices[10] -- Inicia com IBOVESPA

-- Função para processar a resposta da API de bolsa (FMP)
function processarRespostaBolsa(jsonData, indice, nomeIndice)
    local success, dados = pcall(cjson.decode, jsonData)
    if not success then
        return "Erro ao processar dados da bolsa: formato inválido."
    end
    
    if not dados or #dados == 0 then
        return "Erro: Dados da cotação para " .. nomeIndice .. " não encontrados."
    end
    
    local quote = dados[1]
    if not quote.price then
        return "Erro: Preço não encontrado para " .. nomeIndice .. "."
    end
    
    local preco = tonumber(quote.price) or 0
    local variacaoPercentual = tonumber(quote.changesPercentage) or 0
    local dataAtualizacao = os.date("%Y-%m-%d %H:%M:%S", quote.timestamp or os.time())
    local precoAbertura = tonumber(quote.open) or 0
    local maxima = tonumber(quote.dayHigh) or 0
    local minima = tonumber(quote.dayLow) or 0
    local volume = quote.volume or "N/A"
    local variacaoValor = tonumber(quote.change) or 0
    
    return string.format(
        "📈 %s - Resumo do Mercado\n\n" ..
        "Preço Atual: %.2f\n" ..
        "Abertura: %.2f\n" ..
        "Máxima: %.2f\n" ..
        "Mínima: %.2f\n" ..
        "Variação: %.2f (%.2f%%)\n" ..
        "Volume: %s\n" ..
        "Última Atualização: %s\n",
        nomeIndice, preco, precoAbertura, maxima, minima, 
        variacaoValor, variacaoPercentual, volume, dataAtualizacao
    )
end

-- Função para processar a resposta da HG Brasil (Ibovespa com mais informações)
function processarRespostaHGBrasil(jsonData)
    local success, dados = pcall(cjson.decode, jsonData)
    if not success then
        return "Erro ao processar dados da HG Brasil: formato inválido."
    end
    
    if not dados.results then
        return "Erro: Dados não disponíveis na resposta da API."
    end
    
    local resposta = "📈 Brasil - São Paulo - IBOVESPA - Resumo do Mercado\n\n"
    
    -- Dados do Ibovespa
    if dados.results.stocks and dados.results.stocks.IBOVESPA then
        local ibov = dados.results.stocks.IBOVESPA
        local pontos = math.floor(tonumber(ibov.points) or 0)
        local variacao = tonumber(ibov.variation) or 0
        local abertura = tonumber(ibov.opening) or 0
        local maxima = tonumber(ibov.max) or 0
        local minima = tonumber(ibov.min) or 0
        resposta = resposta .. string.format(
            "Pontos: %d\n" ..
            "Abertura: %d\n" ..
            "Máxima: %d\n" ..
            "Mínima: %d\n" ..
            "Variação: %.2f%%\n",
            pontos, abertura, maxima, minima, variacao
        )
    else
        resposta = resposta .. "Dados do Ibovespa não disponíveis.\n"
    end
    
    -- Dados de moedas (USD, EUR)
    if dados.results.currencies then
        resposta = resposta .. "\n💱 Cotações de Moedas (Ref. BRL):\n"
        local usd = dados.results.currencies.USD
        local eur = dados.results.currencies.EUR
        if usd then
            resposta = resposta .. string.format(
                "USD - Compra: %.2f | Venda: %.2f | Variação: %.2f%%\n",
                tonumber(usd.buy) or 0, tonumber(usd.sell) or 0, tonumber(usd.variation) or 0
            )
        end
        if eur then
            resposta = resposta .. string.format(
                "EUR - Compra: %.2f | Venda: %.2f | Variação: %.2f%%\n",
                tonumber(eur.buy) or 0, tonumber(eur.sell) or 0, tonumber(eur.variation) or 0
            )
        end
    end
    
    -- Dados de taxas (CDI, Selic)
    if dados.results.taxes and #dados.results.taxes > 0 then
        local taxas = dados.results.taxes[1]
        resposta = resposta .. "\n📊 Taxas Brasileiras:\n"
        if taxas.cdi then
            resposta = resposta .. string.format("CDI: %.2f%%\n", tonumber(taxas.cdi) or 0)
        end
        if taxas.selic then
            resposta = resposta .. string.format("Selic: %.2f%%\n", tonumber(taxas.selic) or 0)
        end
    end
    
    resposta = resposta .. string.format("Última Atualização: %s\n", os.date("%Y-%m-%d %H:%M:%S"))
    return resposta
end

-- Layout
layout = {
    LinearLayout,
    orientation = "vertical",
    layout_width = "match_parent",
    layout_height = "match_parent",
    backgroundColor = "#000000",
    padding = "10dp",
    {
        ScrollView,
        layout_width = "match_parent",
        layout_height = "0dp",
        layout_weight = "1",
        {
            LinearLayout,
            orientation = "vertical",
            layout_width = "match_parent",
            layout_height = "wrap_content",
            {
                TextView,
                id = "textoResposta",
                layout_width = "match_parent",
                layout_height = "wrap_content",
                text = "Bem-vindo ao Bolsa Fácil. Consulte o Ibovespa ou selecione um índice.",
                textSize = "16sp",
                textColor = "#ffffff",
                padding = "10dp",
            },
        },
    },
    {
        Button,
        text = "Consultar Ibovespa",
        id = "botaoPesquisarIbovespa",
        textColor = "#ffffff",
        backgroundColor = "#00AA00",
        layout_width = "wrap_content",
        layout_height = "wrap_content",
        layout_marginBottom = "10dp",
        onClick = function(view)
            botaoPesquisarIbovespa.setEnabled(false)
            botaoOutraIndice.setEnabled(false)
            textoResposta.setText("Consultando Ibovespa, por favor aguarde...")
            service.speak("Consultando Ibovespa, por favor aguarde...")
            
            local url = hgBrasilApiUrlBase .. "?key=" .. apiKeyHGBrasil
            Http.get(url, function(status, dados)
                botaoPesquisarIbovespa.setEnabled(true)
                botaoOutraIndice.setEnabled(true)
                
                if status == 200 and dados then
                    local dadosProcessados = processarRespostaHGBrasil(dados)
                    textoResposta.setText(dadosProcessados)
                    indiceSelecionadoAtual = indices[10] -- IBOVESPA
                    botaoIndiceSelecionado.setText("Índice Selecionado: Brasil - São Paulo - IBOVESPA")
                    service.speak("Ibovespa consultado com sucesso.")
                else
                    textoResposta.setText("Erro ao conectar à API HG Brasil. Status: " .. tostring(status))
                    service.speak("Erro ao conectar à API HG Brasil.")
                end
            end)
        end,
    },
    {
        Button,
        id = "botaoIndiceSelecionado",
        text = "Índice Selecionado: Brasil - São Paulo - IBOVESPA",
        textColor = "#ffffff",
        backgroundColor = "#555555",
        layout_width = "match_parent",
        layout_height = "wrap_content",
        layout_marginBottom = "10dp",
        onClick = function(view)
            local context = view.getContext()
            local menu = PopupMenu(context, view)
            for i, indice in ipairs(indices) do
                menu.getMenu().add(indice.nome)
            end
            menu.setOnMenuItemClickListener({
                onMenuItemClick = function(item)
                    local nomeIndice = item.getTitle()
                    for i, idx in ipairs(indices) do
                        if idx.nome == nomeIndice then
                            indiceSelecionadoAtual = idx
                            break
                        end
                    end
                    botaoIndiceSelecionado.setText("Índice Selecionado: " .. nomeIndice)
                    return true
                end
            })
            menu.show()
        end,
    },
    {
        Button,
        text = "Consultar Índice",
        id = "botaoOutraIndice",
        textColor = "#ffffff",
        backgroundColor = "#0066AA",
        layout_width = "wrap_content",
        layout_height = "wrap_content",
        layout_marginBottom = "10dp",
        onClick = function(view)
            local indiceSelecionado = indiceSelecionadoAtual
            botaoPesquisarIbovespa.setEnabled(false)
            botaoOutraIndice.setEnabled(false)
            textoResposta.setText("Consultando " .. indiceSelecionado.nome .. ", por favor aguarde...")
            service.speak("Consultando " .. indiceSelecionado.nome .. ", por favor aguarde...")
            
            local url
            if indiceSelecionado.nome == "Brasil - São Paulo - IBOVESPA" then
                url = hgBrasilApiUrlBase .. "?key=" .. apiKeyHGBrasil
            else
                url = stockApiUrlBase .. indiceSelecionado.simbolo .. "?apikey=" .. apiKeyFMP
            end
            
            Http.get(url, function(status, dados)
                botaoPesquisarIbovespa.setEnabled(true)
                botaoOutraIndice.setEnabled(true)
                
                if status == 200 and dados then
                    local dadosProcessados
                    if indiceSelecionado.nome == "Brasil - São Paulo - IBOVESPA" then
                        dadosProcessados = processarRespostaHGBrasil(dados)
                    else
                        dadosProcessados = processarRespostaBolsa(dados, indiceSelecionado.simbolo, indiceSelecionado.nome)
                    end
                    textoResposta.setText(dadosProcessados)
                    local cotacao = dadosProcessados:match("Preço Atual: [%d.]+") or dadosProcessados:match("Pontos: %d+")
                    local variacao = dadosProcessados:match("Variação: [%-]?[%d.]+ %([%-]?[%d.]+%%%)") or dadosProcessados:match("Variação: [%-]?[%d.]+%%")
                    if cotacao and variacao then
                        service.speak("Resumo de " .. indiceSelecionado.nome .. ": " .. cotacao .. ", " .. variacao)
                    else
                        service.speak("Erro ao obter os dados.")
                    end
                elseif status == 403 then
                    textoResposta.setText("Erro 403: Acesso negado. Limite de requisições pode ter sido excedido ou símbolo não suportado.")
                    service.speak("Erro 403: Acesso negado.")
                else
                    textoResposta.setText("Erro ao conectar à API. Status: " .. tostring(status))
                    service.speak("Erro ao conectar à API.")
                end
            end)
        end,
    },
    {
        Button,
        text = "Fechar",
        backgroundColor = "#AA0000",
        textColor = "#ffffff",
        layout_width = "wrap_content",
        layout_height = "wrap_content",
        layout_margin = "5dp",
        onClick = function()
            dlg.dismiss()
        end,
    },
}

-- Inicialização do diálogo
dlg = LuaDialog()
dlg.setTitle("Bolsa Fácil - Desenvolvido por Marcos Souza")
local view = loadlayout(layout)
dlg.setView(view)
dlg.show()

service.speak("Bem-vindo ao Bolsa Fácil. Consulte o Ibovespa ou selecione um índice da lista.")